#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "hash.h"
#include <unistd.h>
#include <signal.h>

#define	STRSIZE 46

void	clear_str(char *, int);
int 	RandomInteger (int, int);
void	reset_rcv(char *, int);

int main(int argc, char *argv[]) {

        FILE 	*fp, *fmark;						// ponteiro para arquivo
        char 	aux[STRSIZE],aux2[5];				// vetor que le a palavra
	int	tamanho;					// tamanho de cada palavra
	char	*palavra = (char*)malloc(sizeof(char)*5);	// palavra a ser procurada
	int	i,j,k;						// controle loop
	int	init_i;
	hash	*tabela;
	node	*noh;
	int	flag;
	char	c;
	int	pos;
	int 	total;
	float 	perc = 0.001;

	srandom(time(NULL));
	k = 0;

	//se der erro ao iniciar o arquivo
        if ( (fp = fopen(argv[1],"r")) == NULL ) 
        {
                printf("Erro ao abrir o arquivo.\n");
                exit(1);
        }  

        //cria uma tabela hash
	tabela=new_hash();
	//zerando mpi_flag
	//for ( i = 0; i < MAX_PROCESS; i++)
	//	mpi_flag[i] = 0;

        //Le o arquivo e carrena na memória
	pos = ftell(fp);
        while(!feof(fp)) 
        {
		//limpa variavel aux
                clear_str(aux,STRSIZE);
		//le do arquivo
		i = 0;

/*		while (i < 5) {
                	fscanf(fp,"%c",&aux[i]);
			if (aux[i] == '\n' || aux[i] == ',' || aux[i] == ' ') {
				break;
			}
			i++;
		}
		if (aux[i] == '\n' || aux[i] == ',' || aux[i] == ' ') {
			aux[i] = 0;
		}*/
		//aloca memoria
//		printf("%s\n",aux);
		fscanf(fp,"%s",aux);
		tamanho=strlen(aux);
		if(tamanho>0 && tamanho < 6)//assim evido q ele aloca valores para \n e \0
		{
			noh= new_node(aux,pos);
			alloc_node(noh,tabela);
		}
		else
		{
			j=0;
			clear_str(aux2,5);
			for(i=0;i<tamanho;i++)
			{
				aux2[j]=aux[i];
				j++;
				if(j==5)
				{
					j=0;
					aux2[4] = 0;
					noh= new_node(aux2,pos);
					alloc_node(noh,tabela);
					clear_str(aux2,5);
				}
			}
			if(j>0)
			{
				noh= new_node(aux2,pos);
				alloc_node(noh,tabela);
			}	
		}  
	pos = ftell(fp)+1;               
        }

	void sig_hand( int sign ) {

		printf("%f\n", ((float) tabela->n_element / (float) total) * 100);

		exit(1);

	}

	signal(SIGINT,sig_hand);
	//print_hash(tabela);
	//Algoritimo
	total = tabela->n_element;
	while(tabela->n_element > 0 && ((float) tabela->n_element / (float) total) > perc)
	{
//		if ( rank == 0 && i%1000 == 0 )
//		printf("%d STARTING\n",rank);
		
		//printf("PROCESS %d RECIEVED\n", rank);

//		if ( rank == 0 && i%1000 == 0 )
//			printf("PROCESS 0 ACTING\n");
		
		tamanho=RandomInteger(1,5); // gera um numero aleatorio de 1 a 5 (inclusive)
		palavra = (char*)realloc(palavra,sizeof(char)*(tamanho)); // realoca o tamanho necessario para palavra gerada.
		clear_str(palavra,tamanho+1);
		//gera palavar aleatoria
		for(j=0;j<tamanho;j++)
				palavra[j]=(char)RandomInteger(97,122);//gera numero aleatorio de a-z (minusculos)

		//if (k%100000 == 0) printf("%d PALAVRA: %s\n",rank,palavra);
		//procura palavra, se encontrar apaga todas
		flag=1;
		flag = rm_node(palavra,tabela);

		k++;
//		if ( rank == 0 && i%1000 == 0 )
//			printf("PROCESS 0 FINALIZING\n");
		//printf("%f\n",((float) tabela->n_element / (float)total));
		
	}

        fclose(fp);
	printf("%f\n",((float) tabela->n_element/ (float)total));
	/*if (cond == 1) {
		printf("%f\n",((float) tabela->n_element / (float)total));
		i = init_i;
		while ( i != rank )
			MPI_Ssend(kill,5,MPI_CHAR, i, 1, MPI_COMM_WORLD);
	}*/

        return 0;

}

void clear_str(char *c, int n) {

    int i = 0;

    for ( i = 0; i < n; i++ ) {
        c[i] = 0;
    }

}

int RandomInteger (int low, int high)
{
    int k;
    double d;
    d = (double) random () / ((double) RAND_MAX + 1);
    k = d * (high - low + 1);
    return low + k;
}













